package main

import (
	"errors"
	"fmt"
	"reflect"
	"strconv"
)

// 学生结构体定义
type Student struct {
	Name   string
	Age    int
	GPA    float64
	Major  string
}

// 打印所有属性的方法
func (s *Student) Print() {
	fmt.Printf("Student Name: %s, Age: %d, GPA: %.2f, Major: %s\n", s.Name, s.Age, s.GPA, s.Major)
}

// 修改任一属性的任一值的方法
func (s *Student) Modify(field, value string) error {
	// 使用反射来动态修改属性值
	studentValue := reflect.ValueOf(s).Elem()
	fieldValue := studentValue.FieldByName(field)

	if !fieldValue.IsValid() {
		return errors.New("no such field: " + field)
	}

	switch fieldValue.Kind() {
	case reflect.String:
		fieldValue.SetString(value)
	case reflect.Int:
		if intValue, err := strconv.Atoi(value); err == nil {
			fieldValue.SetInt(int64(intValue))
		} else {
			return errors.New("invalid integer value: " + value)
		}
	case reflect.Float64:
		if floatValue, err := strconv.ParseFloat(value, 64); err == nil {
			fieldValue.SetFloat(floatValue)
		} else {
			return errors.New("invalid float value: " + value)
		}
	default:
		return errors.New("unsupported field type")
	}

	return nil
}

func main() {
	// 创建一个学生实例并初始化属性
	student := Student{
		Name:  "Alice",
		Age:   20,
		GPA:   3.5,
		Major: "Computer Science",
	}

	// 打印初始属性
	fmt.Println("Before modification:")
	student.Print()

	// 修改属性值
	err := student.Modify("Age", "21")
	if err != nil {
		fmt.Println("Error modifying age:", err)
	}

	// 打印修改后的属性
	fmt.Println("After modification:")
	student.Print()

	// 尝试修改另一个属性
	err = student.Modify("GPA", "3.8")
	if err != nil {
		fmt.Println("Error modifying GPA:", err)
	}

	// 打印最终属性
	fmt.Println("Final state:")
	student.Print()
}